/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.oim.swing.ui.component;

/**
 *
 * @author Administrator
 */
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JPanel;

public class ImagePreviewPanel extends JPanel implements PropertyChangeListener {

	/**
     *
     */
	private static final long serialVersionUID = 1L;
	private int width, height;
	private ImageIcon icon;
	private Image image;
	private static final int ACCSIZE = 155;
	private Color bg;

	public ImagePreviewPanel() {
		setPreferredSize(new Dimension(ACCSIZE, -1));
		bg = getBackground();
	}

	@Override
	public void propertyChange(PropertyChangeEvent e) {
		String propertyName = e.getPropertyName();

		// Make sure we are responding to the right event.
		if (propertyName.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) {
			File selection = (File) e.getNewValue();
			String name;

			if (selection == null) {
				return;
			} else {
				name = selection.getAbsolutePath();
			}

			/*
             * 
             *//*
				 * Make reasonably sure we have an image format that AWT can
				 * handle so we don't try to draw something silly.
				 */
			if ((name != null) && name.toLowerCase().endsWith(".jpg") || name.toLowerCase().endsWith(".jpeg") || name.toLowerCase().endsWith(".gif") || name.toLowerCase().endsWith(".png")) {
				icon = new ImageIcon(name);
				image = icon.getImage();
				scaleImage();
				repaint();
			}
		}
	}

	private void scaleImage() {
		width = image.getWidth(this);
		height = image.getHeight(this);
		double ratio = 1.0;

		/*
         * 
         *//*
			 * Determine how to scale the image. Since the accessory can expand
			 * vertically make sure we don't go larger than 150 when scaling
			 * vertically.
			 */
		if (width >= height) {
			ratio = (double) (ACCSIZE - 5) / width;
			width = ACCSIZE - 5;
			height = (int) (height * ratio);
		} else {
			if (getHeight() > 150) {
				ratio = (double) (ACCSIZE - 5) / height;
				height = ACCSIZE - 5;
				width = (int) (width * ratio);
			} else {
				ratio = (double) getHeight() / height;
				height = getHeight();
				width = (int) (width * ratio);
			}
		}

		image = image.getScaledInstance(width, height, Image.SCALE_DEFAULT);
	}

	@Override
	public void paintComponent(Graphics g) {
		g.setColor(bg);

		/*
         * 
         *//*
			 * If we don't do this, we will end up with garbage from previous
			 * images if they have larger sizes than the one we are currently
			 * drawing. Also, it seems that the file list can paint outside of
			 * its rectangle, and will cause odd behavior if we don't clear or
			 * fill the rectangle for the accessory before drawing. This might
			 * be a bug in JFileChooser.
			 */
		g.fillRect(0, 0, ACCSIZE, getHeight());
		g.drawImage(image, getWidth() / 2 - width / 2 + 5, getHeight() / 2 - height / 2, this);
	}

	/**
     *      */
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFileChooser chooser = new JFileChooser();
		ImagePreviewPanel preview = new ImagePreviewPanel();
		chooser.setAccessory(preview);
		chooser.addPropertyChangeListener(preview);
		chooser.showOpenDialog(null);
	}
}
